package org.wdcode.core.dao.spring.ibatis;

import java.util.List;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import org.wdcode.common.tools.Conversion;

/**
 * 本类是对org.springframework.arm.ibatis.support.SqlMapClientDaoSupport(
 * Spring实现ibatisDao)的在封装<br/>
 * 此类不可继承重写，在业务或DAO层直接调用此类方法<br/>
 * 如果封装的方法无法满足需求可用getSqlMapClientTemplate()方法调用原Spring封装的iBatis Dao方法<br/>
 * @author WD
 * @since JDK6
 * @version 1.0 2009-07-24
 */
public final class BasicIBatisDao extends SqlMapClientDaoSupport {
	/**
	 * 插入操作
	 * @param statementName 插入操作名
	 * @return 插入成功返回的主键
	 */
	public final int insert(String statementName) {
		return insert(statementName, null);
	}

	/**
	 * 插入操作
	 * @param statementName 插入操作名
	 * @param parameterObject 参数对象
	 * @return 插入成功返回的主键
	 */
	public final int insert(String statementName, Object parameterObject) {
		return Conversion.toInt(getSqlMapClientTemplate().insert(statementName, parameterObject));
	}

	/**
	 * 插入操作
	 * @param statementName 插入操作名
	 * @return 更新成功的行数
	 */
	public final int update(String statementName) {
		return update(statementName, null);
	}

	/**
	 * 更新操作
	 * @param statementName 更新操作名
	 * @param parameterObject 参数对象
	 * @return 更新成功的行数
	 */
	public final int update(String statementName, Object parameterObject) {
		return getSqlMapClientTemplate().update(statementName, parameterObject);
	}

	/**
	 * 删除操作
	 * @param statementName 删除操作名
	 * @return 更新成功的行数
	 */
	public final int delete(String statementName) {
		return delete(statementName, null);
	}

	/**
	 * 删除操作
	 * @param statementName 删除操作名
	 * @param parameterObject 参数对象
	 * @return 删除成功的行数
	 */
	public final int delete(String statementName, Object parameterObject) {
		return getSqlMapClientTemplate().delete(statementName, parameterObject);
	}

	/**
	 * 查询返回单个对象
	 * @param statementName 查询操作名
	 * @return 返回单个查询对象
	 */
	public final Object get(String statementName) {
		return get(statementName, null);
	}

	/**
	 * 查询返回单个对象
	 * @param statementName 查询操作名
	 * @param parameterObject 查询操作名
	 * @return 返回单个查询对象
	 */
	public final <E> E get(String statementName, Object parameterObject) {
		return get(statementName, parameterObject, (E) null);
	}

	/**
	 * 查询返回单个对象
	 * @param statementName 查询操作名
	 * @param parameterObject 查询操作名
	 * @param resultObject 返回的对象
	 * @return 返回单个查询对象
	 */
	@SuppressWarnings("unchecked")
	public final <E> E get(String statementName, Object parameterObject, E resultObject) {
		return (E) getSqlMapClientTemplate().queryForObject(statementName, parameterObject, resultObject);
	}

	/**
	 * 查询返回结果为List
	 * @param statementName 查询操作名
	 * @return List结果集
	 */
	public final <E> List<E> query(String statementName) {
		return query(statementName, null);
	}

	/**
	 * 查询返回结果为List
	 * @param statementName 查询操作名
	 * @param parameterObject 参数对象
	 * @return List结果集
	 */
	@SuppressWarnings("unchecked")
	public final <E> List<E> query(String statementName, E parameterObject) {
		return getSqlMapClientTemplate().queryForList(statementName, parameterObject);
	}

	/**
	 * 查询返回结果为List
	 * @param statementName 查询操作名
	 * @param skipResults 开始结果集
	 * @param maxResults 最多返回结果集
	 * @return List结果集
	 */
	public final <E> List<E> query(String statementName, int skipResults, int maxResults) {
		return query(statementName, null, skipResults, maxResults);
	}

	/**
	 * 查询返回结果为List
	 * @param statementName 查询操作名
	 * @param parameterObject 参数对象
	 * @param skipResults 开始结果集
	 * @param maxResults 最多返回结果集
	 * @return List结果集
	 */
	@SuppressWarnings("unchecked")
	public final <E> List<E> query(String statementName, E parameterObject, int skipResults, int maxResults) {
		return getSqlMapClientTemplate().queryForList(statementName, parameterObject, skipResults, maxResults);
	}
}